SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE [dbo].[paChequearFinesDeLicenciasBK29072008]
-- <DESCRIPCION> Realiza el chequeo de baja de una licencia.
-- <CONSIDERACIONES ESPECIALES> 
-- <TABLAS> tb_ServiciosAgentes, tb_SubServiciosAgentes, tb_ColaDeMovimientos, tb_PlazasDeMovimiento
-- <PROCEDIMIENTOS> paChequearIncompatibilidadHoriaria (agregado el 05 - 04 - 2006)
-- <ACTUALIZACIONES> 05 - 04 -2006 por OTERO, Javier. (Control de Incompatibilidad cuando finaliza la licencia y la misma cuenta incompatibilidad)
-- <ACTUALIZACIONES> 08 - 04 -2006 por OTERO, Javier. (Se agrega que no controle si son horas por decreto 125c.)
-- <ACTUALIZACIONES> 08 - 04 -2006 por OTERO, Javier. (Se agrega nuevo control de fechas para cuando se finaliza una licencia que ya tiene fecha de baja.)
-- <ACTUALIZACIONES> 09 - 05 -2006 por OTERO, Javier. (Se agrega nuevo control de fechas de antiguedad o posterioridad del movimiento.)
-- <ACTUALIZACIONES> 23 - 06 -2006 por OTERO, Javier. (Se agregan controles en la finalizacion de una LE.)
-- <ACTUALIZACIONES> 17 - 07 -2006 por SANES, Jorge.  (Se cambio codigo de retorno en controles de Servicios ExtraSistema)

---- ACTUALIZADO EN DB
-- 12/04/2006 - SANES, Jorge
-- 15/04/2006 - SANES, Jorge 
-- 17/07/2006 - SANES, Jorge 

@idCola INT,
@Estado INT OUTPUT,
@Diagnostico VARCHAR(1000) OUTPUT
AS
SET NOCOUNT ON
DECLARE @Warning VARCHAR(1000)
DECLARE @Fecha1 DATETIME
DECLARE @Fecha2 DATETIME
DECLARE @SitRev INT
DECLARE @Agente INT
DECLARE @SubServicio INT
DECLARE @Servicio INT
DECLARE @Licencia INT
DECLARE @error INT
DECLARE @DuracionMax INT
DECLARE @dias INT
DECLARE @RequiereEnfermedad VARCHAR(1)
DECLARE @UTDurMax INT
DECLARE @UTAntMin INT
DECLARE @AntMin INT
DECLARE @UTCAntMin INT
DECLARE @IntermedioObligatorio INT
DECLARE @UTIntermedioObligatorio INT
DECLARE @Limite1 INT
DECLARE @Limite2 INT
DECLARE @UTLimite1 INT
DECLARE @UTLimite2 INT
DECLARE @UTCLimite1 INT
DECLARE @UTCLimite2 INT
DECLARE @CantMax INT
DECLARE @UTCCantMax INT
DECLARE @UTC VARCHAR(10)
DECLARE @cod INT
DECLARE @SPEspecifico VARCHAR(50)
DECLARE @FAlta DATETIME
DECLARE @SitLabAsociada INT
DECLARE @CUPOFDestino INT
DECLARE @FechaTermino DATETIME
DECLARE @FechaAEvaluar DATETIME
DECLARE @DuracionMinima INT
DECLARE @UTDuracionMinima INT
DECLARE @Servicioagente INT
DECLARE @Plaza INT
-- Para almacenar el modo del usuario.
DECLARE @Modo INT
-- Para evaluar la antiguedad o posterioridad del movimiento
DECLARE @DiasAnterioresBaja INT
-- Para evaluar la antiguedad o posterioridad del movimiento
DECLARE @DiasPosterioresBaja INT
-- Para almacenar el Id de Servicio Extrasistema (de existir)
DECLARE @IdServicioExtraSistema INT
-- Para almacenar el IdPlaza del Servicio Extrasistema (de existir)
DECLARE @IdPlazaExtraSistema INT

SELECT @Modo = Modo FROM tb_Usuarios WHERE NTUser = SYSTEM_USER

SELECT @Diagnostico = ''
SELECT @error = 0
SELECT @cod = 0
SELECT @dias = 0
SELECT @Estado = 0
SELECT @IdServicioExtraSistema = NULL, @IdPlazaExtraSistema = NULL

SELECT @Fecha2 = Fecha2, @Agente = Agente, @Licencia = Licencia, @SitRev = SitRev,  @FechaTermino = FechaTermino FROM tb_ColaDeMovimientos WHERE idCola = @idCola

SELECT @SubServicio = servicio, @CUPOFDestino = PlazaDestino FROM tb_PlazasDeMovimiento WHERE idCola = @idCola

SELECT @Servicio = ServicioAgente, @FAlta = FechaAlta, @Licencia = Licencia, @ServicioAgente = ServicioAgente, @Fecha1 = FechaAlta, @Plaza = Plaza  
FROM tb_SubServiciosAgentes WHERE idSubServicio = @SubServicio

SELECT @DiasPosterioresBaja = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeBajaPosterior'
SELECT @DiasAnterioresBaja = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeBajaAnteriores'

SELECT @SitRev = SituacionRevista FROM tb_ServiciosAgentes WHERE idServicioagente = @Servicio

-- Se extrae el regimen de licencia de la licencia a bajar.
SELECT @DuracionMax = DuracionMaxima, @RequiereEnfermedad = RequiereRegEnfermedad,
@UTDurMax = UTDuracionMaxima, @UTAntMin = UTAntiguedadMinima, @AntMin = AntiguedadMinima, @UTCAntMin = UTCAntiguedadMinima,
@IntermedioObligatorio = INTermedioObligatorio, @UTIntermedioObligatorio = UTIntermOblig, @Limite1 = LimiteDias1, @UTLimite1 = UTLimiteDias1,
@UTCLimite1 = UTCLimiteDias1,  @Limite2 = LimiteDias2, @UTLimite2 = UTLimiteDias2, @UTCLimite2 = UTCLimiteDias2, @CantMax = CantidadMaxPedidos,
@UTCCantMax = UTCCantidadMaxPed, @SPEspecifico = RestriccionEspecifica, @SitLabAsociada = SituacionLaboralAsociada,
@DuracionMinima = DuracionMinima, @UTDuracionMinima = UTDuracionMinima
FROM tb_licencias WHERE idLicencia = @Licencia

-- Control nuevo. Si la licencia esta dada de baja porque existen movimirentos posteriores y la fecha de baja nueva es posterior a la fecha de alta de un subservicio posterior.
-- Agregado el 18-04-2006
IF EXISTS(SELECT top 1 IdSubServicio FROM tb_SubServiciosAgentes WHERE IdSubServicio = @SubServicio AND FechaBaja IS NOT NULL)
	AND EXISTS(SELECT top 1 IdSubServicio FROM tb_SubServiciosAgentes WHERE ServicioAgente = @Servicio AND @Fecha2 >= FechaAlta AND IdSubServicio <> @SubServicio AND  ( (FechaBaja IS NOT NULL AND @Fecha2 <= FechaBaja)  OR (FechaBaja IS NULL)))
BEGIN
	SELECT @Estado = 3,@Diagnostico= 'Error! La fecha de baja que intenta informar se superpone con un subservicio posterior.'
	GOTO SALIR
END 

-- Control de Servicio Extrasistema (Agregado 23-06-2006).
-- Si la licencia que se va a limitar tiene Situacion Laboral Asociada = LE
IF EXISTS(SELECT top 1 IdLicencia FROM tb_Licencias WHERE IdLicencia = @Licencia AND SituacionLaboralAsociada = 1)
BEGIN
	
	-- Se extrae el Id de Servicio y Id Plaza del Extrasistema correspondiente.
	SELECT @IdServicioExtraSistema = IdServicio,  @IdPlazaExtraSistema = Plaza
	FROM tb_RelInterServicios R
	INNER JOIN tb_ServiciosAgentes S ON R.IdServicio = S.IdServicioAgente
	INNER JOIN tb_SubServiciosAgentes SS ON SS.ServicioAgente = S.IdServicioAgente
	WHERE S.FechaBaja IS NULL 
	AND R.IdServicio2 = @Servicio 
	AND SS.FechaBaja IS NULL
	AND TipoRelacion = 8

	-- Se verifica si el extrasistema tiene movimientos posteriores.
	IF EXISTS(SELECT top 1 IdSubServicio FROM tb_SubServiciosAgentes WHERE ServicioAgente = @IdServicioExtraSistema AND FechaAlta > @Fecha2)
	BEGIN
		SELECT @Estado = 3,@Diagnostico= '*' + 'El Servicio Extra-Sistema tiene movimientos posteriores. Deshaga los movimientos para poder finalizar esta Licencia Extraordinaria'
		GOTO SALIR
	END

	-- Se verifica que no exista un suplente activo a la fecha de baja en la misma plaza.
	IF EXISTS(SELECT top 1 IdServicioAgente 
		FROM tb_ServiciosAgentes S
		INNER JOIN tb_SubServiciosAgentes SS ON S.IdServicioAgente = SS.ServicioAgente
		WHERE IdServicioAgente = @IdServicioExtraSistema
		AND Agente <> @Agente AND ( (SS.FechaBaja IS NULL) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja >= @Fecha2))
		AND Plaza = @IdPlazaExtraSistema)
	BEGIN
		SELECT @Estado = 3, @Diagnostico = '*' + 'El Servicio Extrasistema no puede bajarse porque existe otro Agente ocupando esa plaza (probablemente un Suplente).'
		GOTO SALIR
	END
	
END

-- Control de incompatibilidad.
IF EXISTS(SELECT top 1 IdLicencia FROM tb_Licencias WHERE IdLicencia = @Licencia AND CuentaIncompatibilidad = 'N')
BEGIN
	DECLARE @HorasMediaIniciales INT, @HorasTerciariasIniciales INT, @HorasCargoIniciales INT
	DECLARE @EsIncompatible BIT, @Horas INT, @HorasTerciarias INT
	DECLARE @Fecha DATETIME
	SELECT @HorasMediaIniciales = 0, @HorasTerciariasIniciales = 0, @HorasCargoIniciales = 0

	SELECT @Fecha = DATEADD(DAY, 1, @Fecha2)

	-- Si la causa de alta del Servicio no es por Articulo 131 o 125c.
	IF NOT EXISTS(SELECT top 1 IdServicioAgente FROM tb_ServiciosAgentes WHERE IdServicioAgente = @Servicio AND CausaAlta IN (12, 18))
		SELECT @HorasMediaIniciales = CASE WHEN C.RegimenSalarial = 13 AND CargoSalarial <> 4001 THEN S.Horas ELSE 0 END,
			 @HorasTerciariasIniciales = CASE WHEN C.RegimenSalarial = 13 AND S.CargoSalarial = 4001 THEN S.Horas 
							   WHEN C.RegimenSalarial = 12 AND C.Escalafon = 24 THEN C.EquivHoraria ELSE 0 END,
			 @HorasCargoIniciales = CASE WHEN C.RegimenSalarial = 12 AND C.Escalafon <> 24 THEN C.EquivHoraria ELSE 0 END
		FROM tb_ServiciosAgentes S INNER JOIN tb_CargosSalariales C ON C.IdCargo = S.CargoSalarial
		WHERE IdServicioAgente = @Servicio

	-- Se llama al procedimiento de chequeo de Incompatibilidad
	EXEC paChequearIncompatibilidadHoraria @Agente, @HorasMediaIniciales, @HorasTerciariasIniciales, @HorasCargoIniciales, @Fecha, @Fecha, @EsIncompatible OUTPUT, @Horas OUTPUT, @HorasTerciarias OUTPUT, @IdServicioExtraSistema
	
	IF @EsIncompatible = 1
	BEGIN
		SELECT @Estado = 3,@Diagnostico= '*' + 'Finalizando la licencia el Agente entraria en Incompatibilidad Horaria ( Horas Totales: '+CONVERT(VARCHAR, @Horas)+' Horas Terciarias: ' + CONVERT(VARCHAR, @HorasTerciarias) + ')'
		GOTO SALIR
	END
END

DECLARE @F1 DATETIME
SELECT @dias = 0
IF @Licencia NOT IN (SELECT IdLicencia FROM tb_Licencias WHERE SituacionExtAsociada = 2)--Si no es una licencia EXTRAORDINARIA
BEGIN
IF (SELECT Licencia FROM tb_SubServiciosAgentes WHERE ServicioAgente = @ServicioAgente AND FechaBaja = DATEADD(DAY, -1, @Fecha1)) = @Licencia
	BEGIN
	IF (@UTDurMax = 1)
	BEGIN
		SELECT @F1 = FechaAlta FROM tb_SubServiciosagentes WHERE ServicioAgente = @ServicioAgente AND FechaBaja = DATEADD(DAY,1,@Fecha1)
		SELECT @dias = DATEDIFF(DAY, @F1, @Fecha2)
	END
	ELSE
	BEGIN
		SELECT @F1 = FechaAlta FROM tb_SubServiciosagente WHERE ServicioAgente = @ServicioAgente AND FechaBaja = DATEADD(DAY,1,@Fecha1)
		EXEC @dias = spDifDiasHabiles @F1, @Fecha2
	END
	END		
IF (@UTDurMax = 1)
	SELECT @dias = @dias+DATEDIFF(DAY, @Fecha1, @Fecha2)
ELSE
BEGIN
	DECLARE @dias2 INT
	EXEC @dias2 = spDifDiasHabiles @Fecha1, @Fecha2
	SELECT @Dias = @dias + @dias2
END
	IF @dias > @DuracionMax
	BEGIN
		SELECT @Estado = 1,@Diagnostico= '*' + 'Se supera el total de dias ('+convert(varchar, @duracionmax)+') permitidos por esta licencia'
		GOTO SALIR
	END
END

IF EXISTS(SELECT top 1  IdServicioAgente FROM tb_ServiciosAgentes S INNER JOIN tb_SubServiciosAgentes SS ON IdServicioAgente = ServicioAgente
	WHERE Plaza = @Plaza AND Agente <> @Agente AND SS.FechaAlta <= @Fecha2 AND ( (SS.FechaBaja IS NULL) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja >= @Fecha2) ))
BEGIN
	SELECT @Estado = 1, @Diagnostico = '*' + '*Error! No se puede finalizar la licencia porque no pueden existir dos docentes trabajando en la plaza (Bajar la suplencia primero)'
	GOTO SALIR
END

IF @fecha2 < @FAlta
BEGIN
	SELECT @Estado = 1, @Diagnostico = '*Error! La fecha de baja es menor a la fecha de alta del subservicio'
	GOTO SALIR
END

-- Control que el movimiento no este alejado del dia de la fecha. (Agregado el 09-05-2006)
IF  @Fecha2 < GETDATE() AND (DATEDIFF(DAY, @Fecha2, GETDATE())+1) > @DiasAnterioresBaja
	SELECT @Estado = 1, @Diagnostico = 'Error! La fecha de baja exede la cantidad de dias permitidos anteriores a la fecha de hoy (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresBaja)+' dias de diferencia).'
ELSE
	IF @Fecha2 IS NOT NULL AND @Fecha2 > GETDATE() AND (DATEDIFF(DAY, GETDATE(), @Fecha2)+1) > @DiasPosterioresBaja
		SELECT @Estado = 1, @Diagnostico = 'Error! La fecha de baja exede la cantidad de dias permitidos posteriores a la fecha de hoy (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresBaja)+' dias de diferencia).'

--Siempre se actualiza el estado en CHECK OK
UPDATE tb_PlazasDeMovimiento SET estado = @Estado WHERE idCola = @idCola

SALIR:
UPDATE tb_ColaDeMovimientos SET Estado = @Estado, EstadoCheck = @Error, ChequeoEscuela = CASE WHEN @Modo = 2 THEN @Diagnostico ELSE ChequeoEscuela END 
WHERE idCola = @idCola
GO
